#include "Jeu.h"


Jeu * creerJeu(const int nbJ, const int nbP)
{
    Jeu *unJeu = (Jeu *)malloc(sizeof(Jeu));
    initJeu(unJeu,nbJ, nbP);
    return unJeu;
}
void initJeu(Jeu *jeu, const int nbJ, const int nbP)
{
    int i;

    jeu->nombrePlateaux = nbP;
    jeu->plateaux = malloc(sizeof(Plateau*)*(jeu->nombrePlateaux));
    for(i=0;i<jeu->nombrePlateaux;i++)
    {
        jeu->plateaux[i] = creerPlateau(nbJ);
        remplirPlateau(jeu->plateaux[i], i);
    }

    jeu->nbrJ = nbJ;
    jeu->jou = malloc(sizeof(Joueur*)*(jeu->nbrJ));
    for(i=0;i<jeu->nbrJ;i++)
    {
        jeu->jou[i] = creerJoueur();
        set_id(jeu->jou[i], i+1);
        sprintf(jeu->jou[i]->pseudo, "GEEK %d", i+1);
        /*set_pseudo(jeu->jou[i], "titi");*/
    }
    jeu->joueurActu = 0;

    jeu->pioche = creerPioche();
        remplirPioche(jeu->pioche, "data/carte/Pioche.txt");

    jeu->bonusBU = creerPioche();
        remplirPioche(jeu->bonusBU, "data/carte/BonusBU.txt");
    jeu->bonusRU = creerPioche();
        remplirPioche(jeu->bonusRU, "data/carte/BonusRU.txt");
    jeu->bonusCYBER = creerPioche();
        remplirPioche(jeu->bonusCYBER, "data/carte/BonusCYBER.txt");
    jeu->bonusTRICHE = creerPioche();
        remplirPioche(jeu->bonusTRICHE, "data/carte/BonusTRICHE.txt");


    jeu->des = creerDes();

    jeu->etatJeu = 0;
}
void libereJeu(Jeu *jeu)
{
    int i;

    for(i=0;i<jeu->nombrePlateaux;i++)
    {
        detruitPlateau(&jeu->plateaux[i]);
    }
    jeu->nombrePlateaux = 0;
    free(jeu->plateaux);

    for(i=0;i<jeu->nbrJ;i++)
        detruitJoueur(&jeu->jou[i]);

    jeu->nbrJ = 0;
    free(jeu->jou);
    jeu->joueurActu = 0;

    detruitPioche(&jeu->pioche);

    detruitPioche(&jeu->bonusBU);
    detruitPioche(&jeu->bonusRU);
    detruitPioche(&jeu->bonusCYBER);
    detruitPioche(&jeu->bonusTRICHE);

    detruitDes(&jeu->des);

    jeu->etatJeu = 0;
}
void detruitJeu(Jeu **jeu)
{
    libereJeu(*jeu);
    free(*jeu);
    *jeu = NULL;
}
void remplirPlateau(Plateau * plat, const int numPlat)
{
    ListeTempQ * liste = creerListeTempQ();
    FILE * fic;
    char *nomFic = malloc(sizeof(char)*64);
    sprintf(nomFic,"data/niveau/question%d.txt",numPlat);
    suppLigneVide(nomFic);
    fic = fichierInit(nomFic);

    remplirQuestFichier(fic,liste);

    repartirCase(plat);

	repartirQuest(plat,liste);

    detruitListeTempQ(&liste);
    fclose(fic);
    free(nomFic);
}


void joueurUnTour(Jeu * jeu)
{
    int act = jeu->joueurActu;
	int des;
	des = lancerDes(jeu->des);

	setPosition(jeu->jou[act], getPosition(jeu->jou[act])+des);
	if(getPosition(jeu->jou[act]) > 35)
	{
		setPosition(jeu->jou[act],35);
	}
}
void joueurSuivant(Jeu *jeu)
{
    int actu = jeu->joueurActu;
    int nbJoueur = jeu->nbrJ;

    if(actu<nbJoueur-1)
        jeu->joueurActu++;
    else
        jeu->joueurActu = 0;
}
bool bilanJoueur(Jeu *jeu)
{
    Joueur *jou = jeu->jou[jeu->joueurActu];
    int nbPlat = jeu->nombrePlateaux;

    if(jou->scoreCredit < 5)
    {
        jou->position = 0;
        return false;
    }
    else if((jou->scoreCredit >= 5) && (jou->niveauJoueur < nbPlat-1))
    {
        jou->position = 0;
        jou->scoreCredit = 0;
        jou->niveauJoueur++;
        return false;
    }
    else
        return true;
}
void consequenceCarteJoueur(Carte * C, Joueur * j)
{
	GenreCarte genre = getGenreCarte(C);
	switch(genre)
	{
	    case null:
            break;
		case avancer3:
			setPosition(j,getPosition(j)+3);
			if(getPosition(j)>35)
                setPosition(j, 35);
			break;
		case reculer3:
			setPosition(j,getPosition(j)-3);
            if(getPosition(j)<0)
                setPosition(j, 0);
			break;
		case creditplus:
			setScore(j,getScore(j)+1);
			break;
		case creditmoins:
			setScore(j,getScore(j)-1);
            if(getScore(j)<0)
                setScore(j, 0);
			break;
		case passetour:
			set_etat(j,0);
			break;
		case reponse:
            if(j->nbMainJoueur<4)
            {
                j->mainJoueur[j->nbMainJoueur] = C;
                j->nbMainJoueur++;
            }
			break;
		case sandwich:
            if(j->nbMainJoueur<4)
            {
                j->mainJoueur[j->nbMainJoueur] = C;
                j->nbMainJoueur++;
            }
			break;
	}
}

void enleverCarteMain(Joueur *jou, const int pos)
{
    int i;
    int nbBon = jou->nbMainJoueur;

    for(i=pos; i<nbBon-1;i++)
    {
        jou->mainJoueur[i] = jou->mainJoueur[i+1];
    }
    jou->nbMainJoueur--;
}
